package com.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

//SpringNVC数据响应
//就是当前处理器(Controller对应的方法)执行完毕后返回的结果类型
@Controller
public class DataResponseController {

    //页面跳转
    //响应结果后 springMVC基于返回的结果 使用视图解析器解析 返回给客户端页面
    //默认使用转发访问 所以可以访问web-info下的资源 url地址不会改变
    //可以添加前缀redirect: 设置为重定向 无法携带数据

    //1、返回值为视图字符串
    @RequestMapping("/data1.do")
    public String data1(HttpServletRequest request){
        request.setAttribute("msg", "返回值为视图字符串");
        return "redirect:/view/data1.jsp";//会自动将结果进行视图拼接 返回给客户端
    }

    //2、返回ModelAndView设置视图
    //借助Spring功能 将对象的创建设置为参数 自动创建指定对象(可以理解为该对象交由spring管理 可以直接注入使用)
    @RequestMapping("data2.do")
    public ModelAndView data2(ModelAndView mv){
        mv.setViewName("data2");
        mv.addObject("msg", "返回ModelAndView设置视图");
        return mv;
    }

    //直接返回数据
    //直接返回字符串数据
    //使用response对象方法回写数据
    @RequestMapping("/data3.do")
    public void data3(HttpServletResponse response) throws IOException {
        PrintWriter writer = response.getWriter();
        writer.println("通过response获取输出流在页面输出数据");
    }


    //将需要返回的数据直接通过返回值返回
    @RequestMapping("/data4.do")
    @ResponseBody//告诉spring不要使用视图解析器解析
    public String data4(){
        return "通过返回值设置String直接返回数据";
    }
    //json数据是前后台进行数据交互的格式
    //本质也是字符串 可以通过拼接的形式实现
    @RequestMapping(value="/data5.do")
    @ResponseBody
    public String data5() throws IOException {
        return "{\"username\":\"zhangsan\",\"age\":18}";
    }

    //返回自定义对象
    @RequestMapping(value="/data6.do")
    @ResponseBody
    public User data6()  {
        //如下对象返回
        User user =new User(1,"zhangsan",18);
        //原本我们需要手动拼接json字符串 或者调用json工具类转换后返回
        //return "{\"id\":1,\"username\":\"zhangsan\",\"age\":18}";
        return user;//会自动使用工具类转换并返回
    }


    //返回集合对象
    @RequestMapping(value="/data7.do")
    @ResponseBody
    public List<User> data7() {
        ArrayList<User> list=new ArrayList<>();
        list.add(new User(1,"a1",1));
        list.add(new User(2,"a2",2));
        list.add(new User(3,"a3",3));
        list.add(new User(4,"a4",4));
        return list;//会自动使用工具类转换并返回
    }

}
